using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.SGI.ERP.Entidades;

namespace MakeIT.SGI.ERP.Negocios
{
	public partial class SgiDAOT : DAOT
	{
        public CaixaturnoVO getCaixaturno(int? idCaixaTurno)
        {
            return getCaixaturno(idCaixaTurno, null);
        }

        public CaixaturnoVO getCaixaturno(int? idCaixaTurno, int? idCaixa)
        {
            return getCaixaturno(idCaixaTurno, idCaixa, null);
        }

        public CaixaturnoVO getCaixaturno(int? idCaixaTurno, int? idCaixa, int? idColaborador)
        {
            return getCaixaturno(idCaixaTurno, idCaixa, idColaborador, null);
        }

        public CaixaturnoVO getCaixaturno(int? idCaixaTurno, int? idCaixa, int? idColaborador, int? idColaboradorSA)
        {
            return getCaixaturno(idCaixaTurno, idCaixa, idColaborador, idColaboradorSA, null);
        }

        public CaixaturnoVO getCaixaturno(int? idCaixaTurno, int? idCaixa, int? idColaborador, int? idColaboradorSA, int? idColaboradorSF)
        {
            return getCaixaturno(idCaixaTurno, idCaixa, idColaborador, idColaboradorSA, idColaboradorSF, null);
        }

        public CaixaturnoVO getCaixaturno(int? idCaixaTurno, int? idCaixa, int? idColaborador, int? idColaboradorSA, int? idColaboradorSF, DateTime? dtAbertura)
        {
            return getCaixaturno(idCaixaTurno, idCaixa, idColaborador, idColaboradorSA, idColaboradorSF, dtAbertura, null);
        }

        public CaixaturnoVO getCaixaturno(int? idCaixaTurno, int? idCaixa, int? idColaborador, int? idColaboradorSA, int? idColaboradorSF, DateTime? dtAbertura, DateTime? dtFechamento)
        {
            return getCaixaturno(idCaixaTurno, idCaixa, idColaborador, idColaboradorSA, idColaboradorSF, dtAbertura, dtFechamento, null);
        }

        public CaixaturnoVO getCaixaturno(int? idCaixaTurno, int? idCaixa, int? idColaborador, int? idColaboradorSA, int? idColaboradorSF, DateTime? dtAbertura, DateTime? dtFechamento, char? situacao)
		{
			CaixaturnoVO caixaturnoVO = null;
            List<CaixaturnoVO> listCaixaturnoVOs = getCaixaturnos(idCaixaTurno, idCaixa, idColaborador, idColaboradorSA, idColaboradorSF, dtAbertura, dtFechamento, situacao);
			if (listCaixaturnoVOs != null && listCaixaturnoVOs.Count > 0)
			{
				caixaturnoVO = listCaixaturnoVOs[0];
			}
			return caixaturnoVO;
		}

		public List<CaixaturnoVO> getCaixaturnos()
		{
			return getCaixaturnos(null, null, null, null, null, null, null, null);
		}

		public List<CaixaturnoVO> getCaixaturnos(int? idCaixaTurno)
		{
			return getCaixaturnos(idCaixaTurno, null, null, null, null, null, null, null);
		}

		public List<CaixaturnoVO> getCaixaturnos(int? idCaixaTurno, int? idCaixa, int? idColaborador, int? idColaboradorSA, int? idColaboradorSF, DateTime? dtAbertura, DateTime? dtFechamento, char? situacao)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT ctu.idCaixaTurno as ctu_idCaixaTurno, ctu.idCaixa as ctu_idCaixa, cxa.caixa as cxa_caixa, ctu.idColaborador as ctu_idColaborador, ctu.dtAbertura as ctu_dtAbertura, ctu.idColaboradorSA as ctu_idColaboradorSA, ctu.saldoAbertura as ctu_saldoAbertura, ctu.dtFechamento as ctu_dtFechamento, ctu.idColaboradorSF as ctu_idColaboradorSF, ctu.saldoFechamento as ctu_saldoFechamento, ctu.situacao as ctu_situacao, ctu.cadastro as ctu_cadastro, ctu.cadastradoPor as ctu_cadastradoPor, ctu.edicao as ctu_edicao, ctu.editadoPor as ctu_editadoPor  ");
			query.AppendLine("FROM caixaturno as ctu LEFT OUTER JOIN caixa as cxa on ctu.idCaixa=cxa.idCaixa  LEFT OUTER JOIN colaborador as clb on ctu.idColaborador=clb.idColaborador  LEFT OUTER JOIN colaborador as clb2 on ctu.idColaboradorSA=clb2.idColaborador  LEFT OUTER JOIN colaborador as clb3 on ctu.idColaboradorSF=clb3.idColaborador  ");
			if (idCaixaTurno != null)
			{
				query.AppendLine(where + "ctu.idCaixaTurno=@idCaixaTurno ");
				where = "AND ";
			}
			if (idCaixa != null)
			{
				query.AppendLine(where + "ctu.idCaixa=@idCaixa ");
				where = "AND ";
			}
			if (idColaborador != null)
			{
				query.AppendLine(where + "ctu.idColaborador=@idColaborador ");
				where = "AND ";
			}
			if (dtAbertura != null)
			{
				query.AppendLine(where + "ctu.dtAbertura=@dtAbertura ");
				where = "AND ";
			}
			if (idColaboradorSA != null)
			{
				query.AppendLine(where + "ctu.idColaboradorSA=@idColaboradorSA ");
				where = "AND ";
			}
			if (dtFechamento != null)
			{
				query.AppendLine(where + "ctu.dtFechamento=@dtFechamento ");
				where = "AND ";
			}
			if (idColaboradorSF != null)
			{
				query.AppendLine(where + "ctu.idColaboradorSF=@idColaboradorSF ");
				where = "AND ";
			}
			if (situacao != null)
			{
				query.AppendLine(where + "ctu.situacao=@situacao ");
				where = "AND ";
			}


			query.AppendLine("ORDER BY ctu.idCaixaTurno ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			if (idCaixaTurno!= null) cmd.Parameters.Add(getParameter(cmd, "@idCaixaTurno", idCaixaTurno));
			if (idCaixa!= null) cmd.Parameters.Add(getParameter(cmd, "@idCaixa", idCaixa));
			if (idColaborador!= null) cmd.Parameters.Add(getParameter(cmd, "@idColaborador", idColaborador));
			if (dtAbertura!= null) cmd.Parameters.Add(getParameter(cmd, "@dtAbertura", dtAbertura));
			if (idColaboradorSA!= null) cmd.Parameters.Add(getParameter(cmd, "@idColaboradorSA", idColaboradorSA));
			if (dtFechamento!= null) cmd.Parameters.Add(getParameter(cmd, "@dtFechamento", dtFechamento));
			if (idColaboradorSF!= null) cmd.Parameters.Add(getParameter(cmd, "@idColaboradorSF", idColaboradorSF));
			if (situacao!= null) cmd.Parameters.Add(getParameter(cmd, "@situacao", situacao));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<CaixaturnoVO> listCaixaturno = new List<CaixaturnoVO>();

				while (reader.Read())
				{
					CaixaturnoVO caixaturnoVO = CaixaturnoVO.CreateVO();
					caixaturnoVO.idCaixaTurno = reader.GetInt32(reader.GetOrdinal("ctu_idCaixaTurno"));
					caixaturnoVO.idCaixa = reader.GetInt32(reader.GetOrdinal("ctu_idCaixa"));
					if (!reader.IsDBNull(reader.GetOrdinal("cxa_caixa")))
						caixaturnoVO.idCaixaVO.caixa = reader.GetString(reader.GetOrdinal("cxa_caixa"));
					caixaturnoVO.idColaborador = reader.GetInt32(reader.GetOrdinal("ctu_idColaborador"));
					caixaturnoVO.dtAbertura = reader.GetDateTime(reader.GetOrdinal("ctu_dtAbertura"));
					caixaturnoVO.idColaboradorSA = reader.GetInt32(reader.GetOrdinal("ctu_idColaboradorSA"));
					caixaturnoVO.saldoAbertura = reader.GetDecimal(reader.GetOrdinal("ctu_saldoAbertura"));
					if (!reader.IsDBNull(reader.GetOrdinal("ctu_dtFechamento")))
						caixaturnoVO.dtFechamento = reader.GetDateTime(reader.GetOrdinal("ctu_dtFechamento"));
					if (!reader.IsDBNull(reader.GetOrdinal("ctu_idColaboradorSF")))
						caixaturnoVO.idColaboradorSF = reader.GetInt32(reader.GetOrdinal("ctu_idColaboradorSF"));
					if (!reader.IsDBNull(reader.GetOrdinal("ctu_saldoFechamento")))
						caixaturnoVO.saldoFechamento = reader.GetDecimal(reader.GetOrdinal("ctu_saldoFechamento"));
					caixaturnoVO.situacao = reader.GetChar(reader.GetOrdinal("ctu_situacao"));
					caixaturnoVO.cadastro = reader.GetDateTime(reader.GetOrdinal("ctu_cadastro"));
					caixaturnoVO.cadastradoPor = reader.GetString(reader.GetOrdinal("ctu_cadastradoPor"));
					caixaturnoVO.edicao = reader.GetDateTime(reader.GetOrdinal("ctu_edicao"));
					caixaturnoVO.editadoPor = reader.GetString(reader.GetOrdinal("ctu_editadoPor"));


					listCaixaturno.Add(caixaturnoVO);
				}
				reader.Close();
				return listCaixaturno;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setCaixaturno(CaixaturnoVO caixaturnoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE caixaturno ");
			query.AppendLine("SET idCaixa=@idCaixa, idColaborador=@idColaborador, dtAbertura=@dtAbertura, idColaboradorSA=@idColaboradorSA, saldoAbertura=@saldoAbertura, dtFechamento=@dtFechamento, idColaboradorSF=@idColaboradorSF, saldoFechamento=@saldoFechamento, situacao=@situacao,  cadastro=@cadastro, cadastradoPor=@cadastradoPor, edicao=@edicao, editadoPor=@editadoPor ");
			query.AppendLine("WHERE idCaixaTurno=@idCaixaTurno ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idCaixaTurno", caixaturnoVO.idCaixaTurno));
			cmd.Parameters.Add(getParameter(cmd, "@idCaixa", caixaturnoVO.idCaixa));
			cmd.Parameters.Add(getParameter(cmd, "@idColaborador", caixaturnoVO.idColaborador));
			cmd.Parameters.Add(getParameter(cmd, "@dtAbertura", caixaturnoVO.dtAbertura));
			cmd.Parameters.Add(getParameter(cmd, "@idColaboradorSA", caixaturnoVO.idColaboradorSA));
			cmd.Parameters.Add(getParameter(cmd, "@saldoAbertura", caixaturnoVO.saldoAbertura));
			if (caixaturnoVO.dtFechamento == null)
				cmd.Parameters.Add(getParameter(cmd, "@dtFechamento", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@dtFechamento", caixaturnoVO.dtFechamento));
			if (caixaturnoVO.idColaboradorSF == null)
				cmd.Parameters.Add(getParameter(cmd, "@idColaboradorSF", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@idColaboradorSF", caixaturnoVO.idColaboradorSF));
			if (caixaturnoVO.saldoFechamento == null)
				cmd.Parameters.Add(getParameter(cmd, "@saldoFechamento", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@saldoFechamento", caixaturnoVO.saldoFechamento));
			cmd.Parameters.Add(getParameter(cmd, "@situacao", caixaturnoVO.situacao));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", caixaturnoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", caixaturnoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", caixaturnoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", caixaturnoVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newCaixaturno(CaixaturnoVO caixaturnoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO caixaturno ");
			query.AppendLine("  ( idCaixa, idColaborador, dtAbertura, idColaboradorSA, saldoAbertura, dtFechamento, idColaboradorSF, saldoFechamento, situacao, cadastro, cadastradoPor, edicao, editadoPor ) ");
			query.AppendLine("VALUES ( @idCaixa, @idColaborador, @dtAbertura, @idColaboradorSA, @saldoAbertura, @dtFechamento, @idColaboradorSF, @saldoFechamento, @situacao, @cadastro, @cadastradoPor, @edicao, @editadoPor ) ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idCaixa", caixaturnoVO.idCaixa));
			cmd.Parameters.Add(getParameter(cmd, "@idColaborador", caixaturnoVO.idColaborador));
			cmd.Parameters.Add(getParameter(cmd, "@dtAbertura", caixaturnoVO.dtAbertura));
			cmd.Parameters.Add(getParameter(cmd, "@idColaboradorSA", caixaturnoVO.idColaboradorSA));
			cmd.Parameters.Add(getParameter(cmd, "@saldoAbertura", caixaturnoVO.saldoAbertura));
			if (caixaturnoVO.dtFechamento == null)
				cmd.Parameters.Add(getParameter(cmd, "@dtFechamento", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@dtFechamento", caixaturnoVO.dtFechamento));
			if (caixaturnoVO.idColaboradorSF == null)
				cmd.Parameters.Add(getParameter(cmd, "@idColaboradorSF", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@idColaboradorSF", caixaturnoVO.idColaboradorSF));
			if (caixaturnoVO.saldoFechamento == null)
				cmd.Parameters.Add(getParameter(cmd, "@saldoFechamento", System.DBNull.Value));
			else
				cmd.Parameters.Add(getParameter(cmd, "@saldoFechamento", caixaturnoVO.saldoFechamento));
			cmd.Parameters.Add(getParameter(cmd, "@situacao", caixaturnoVO.situacao));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", caixaturnoVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", caixaturnoVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", caixaturnoVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", caixaturnoVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('caixaturno') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delCaixaturno(CaixaturnoVO caixaturnoVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM caixaturno ");
			query.AppendLine("WHERE idCaixaTurno=@idCaixaTurno ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idCaixaTurno", caixaturnoVO.idCaixaTurno));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
		public int getCountCaixaturnoxIdCaixa(int? idCaixa)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idCaixa) as ocorrencias FROM caixaturno WHERE IdCaixa=@IdCaixa ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdCaixa", idCaixa));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
		public int getCountCaixaturnoxIdColaborador(int? idColaborador)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idColaborador) as ocorrencias FROM caixaturno WHERE IdColaborador=@IdColaborador ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdColaborador", idColaborador));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
		public int getCountCaixaturnoxIdColaboradorSA(int? idColaboradorSA)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idColaboradorSA) as ocorrencias FROM caixaturno WHERE IdColaboradorSA=@IdColaboradorSA ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdColaboradorSA", idColaboradorSA));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
		public int getCountCaixaturnoxIdColaboradorSF(int? idColaboradorSF)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idColaboradorSF) as ocorrencias FROM caixaturno WHERE IdColaboradorSF=@IdColaboradorSF ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdColaboradorSF", idColaboradorSF));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
	}
}
